package com.cjm.algorithm.leetcode.listnode.first;

import com.cjm.algorithm.ListNode;

/**
 * 2023-09-11 23:40:56
 */
public class Ti203Easy {
    public static void main(String[] args) {

    }

    /**
     * 2023-09-13 22:50:08
     * @param head
     * @param val
     * @return
     */
    public ListNode removeElements2(ListNode head, int val) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode cur = dummy.next, pre = dummy;
        while (cur != null) {
            if (cur.val == val) {
                pre.next = cur.next;
            } else {
                pre = cur;
            }
            cur = cur.next;
        }
        return dummy.next;
    }

    /**
     * iterator for
     *
     * @param head head
     * @param val  val
     * @return
     */
    public ListNode removeElements1(ListNode head, int val) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        for (ListNode cur = dummy.next, pre = dummy; cur != null; cur = cur.next) {
            if (cur.val == val) {
                pre.next = cur.next;
            } else {
                pre = cur;
            }
        }
        return dummy.next;
    }

    public ListNode removeElements(ListNode head, int val) {
        // 构建一个虚拟节点
        ListNode dummy = new ListNode(-1);
        // 虚拟节点的下一节点， 为head节点
        dummy.next = head;
        // 递归调用
        dfs(dummy, dummy.next, val);
        // 直接返回虚拟节点的下一节点
        return dummy.next;
    }

    /**
     * 递归方法
     *
     * @param pre  pre
     * @param root root
     * @param val  val
     */
    public void dfs(ListNode pre, ListNode root, int val) {
        // 如果下一节点为null， 则直接返回
        if (root == null) return;
        // 如果当前的节点值与val相等
        if (root.val == val) {
            // 那么删除这个节点
            pre.next = root.next;
        } else {
            // 把下一节点赋值给前一节点
            pre = root;
        }
        // 递归调用
        dfs(pre, pre.next, val);
    }
}